#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "scriptreader.h"
#include <xlsxdocument.h>
#include "logreader.h"
#include <QMutex>


#define CONFIG_DIALOG_TITLE (u8"请选择配置文件")
#define LOG_DIALOG_TITLE (u8"请选择Log文件夹")
#define EXCEL_DIALOG_TITLE (u8"请选择Excel文件")
#define CONFIG_DIALOG_FILTER (u8"Json文件 (*.json)")
#define LOG_DIALOG_FILTER (u8"Log日志文件 (*.log *.txt)")
#define EXCEL_DIALOG_FILTER (u8"Excel文件 (*.xlsx)")






QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE







class MainWindow : public QMainWindow
{
    Q_OBJECT

    // typedef struct _guideway_data{
    //     std::shared_ptr<int> track_id;
    //     std::shared_ptr<int> edge_id;
    //     std::shared_ptr<double> edge_start_offset;
    //     // 自定义构造函数
    //     _guideway_data(std::shared_ptr<int> t, std::shared_ptr<int> e, std::shared_ptr<double> o) : track_id{t}, edge_id{e}, edge_start_offset(o) {}
    // }GuidewayData;

    typedef struct _speed_profile{
        std::shared_ptr<int> direction;
        std::shared_ptr<int> track_id;
        QPair<std::shared_ptr<double>, std::shared_ptr<double>> track_offset_pair;
        std::shared_ptr<int> speed;
        // 自定义构造函数
        _speed_profile(){}
        _speed_profile(std::shared_ptr<int> direct, std::shared_ptr<int> id, QPair<std::shared_ptr<double>, std::shared_ptr<double>> offset_pair, std::shared_ptr<int> speed) : direction(direct), track_id(id), track_offset_pair(offset_pair), speed(speed) {}
    }SpeedProfile;

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
protected slots:
    void slotConfigFileSet();           // 设置配置文件
    void slotLogFileSet();              // 设置Log文件
    void slotGuidewaySheetFileSet();    // 设置轨道表文件
    void slotSelectGuidewaySheet();     // 选择guidway工作表
    void slotDataSheetFileSet();        // 设置数据表文件
    void slotReadLog();                 // 读取日志按钮槽函数
    void slotRun();                     // 运行
    void slotLogReadFinished(QHash< QString, QVector< std::shared_ptr<int> > > ret);

private:
    // 从文件选择对话框中获取选中的文件路径
    QString getFilePathFromFileDialog(const QString& title, const QString& defaultDir, const QString& filter);
    // 从文件路径中获取文件所在目录
    QString getDirFromFilePath(const QString& filePath);
    QVector<SpeedProfile> readProfiles(const QXlsx::Worksheet* const data_sheet, const ScriptReader::DataSheetInfo& dataInfo);
    SpeedProfile readOneProfile(const QXlsx::Worksheet* const data_sheet, int* const row, const ScriptReader::DataSheetInfo& dataInfo, bool* const ret);
    void readRangeAndPointList();
    // QHash< int, QVector<int> > getEdgeInfo();
    QVector<SpeedProfile> getSortedProfile(const int& track_id, const int& orientation);
    void sortSpeedProfileList(QVector<SpeedProfile>& list);

signals:
    void startReadLog(QString, std::shared_ptr<QJsonArray>);
    void finished();
    void sendFile(QString);

private:
    Ui::MainWindow *ui;
    QString m_lastOpenDir;
    ScriptReader m_scriptReader;
    // QList<std::shared_ptr<GuidewayData>> m_guidewaySheetData;
    // QHash< QString, QVector< std::shared_ptr<int> > > m_guidewaySheetData;
    QHash< QString, QVector<std::shared_ptr<int>> > m_track_edges_data;
    QHash< int, std::shared_ptr<double> > m_edge_start_offset_data;
    QHash<QString, QVector<std::shared_ptr<QPointF>>> m_curveData;
    QHash< QString, QVector< std::shared_ptr<int> > > m_logData;
    QVector<SpeedProfile> m_dataSheetData;
    QHash<int, QVector<int>> m_edgeInfo; // track_id, edge_id_list
    QPair<int, int> m_axisXRange;
    QMutex mutex;

};
#endif // MAINWINDOW_H
